package it.azienda.managerworkstandard.view;

import it.azienda.framework.persistenza.DAOConnectionSingleton;
import it.azienda.framework.persistenza.DAOException;
import it.azienda.framework.utilita.Utilita;
import it.azienda.framework.view.Dettaglio;
import it.azienda.managerworkstandard.modello.BeanFattura;
import it.azienda.managerworkstandard.modello.BeanFatturaAcquisto;
import it.azienda.managerworkstandard.modello.BeanLogin;
import it.azienda.managerworkstandard.modello.BeanResoCliente;
import it.azienda.managerworkstandard.modello.BeanResoFornitore;
import it.azienda.managerworkstandard.modello.BeanScadenziario;
import it.azienda.managerworkstandard.modello.BeanScontrino;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.faces.component.UIViewRoot;
import javax.faces.component.html.HtmlForm;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.hibernate.Session;

public class DettaglioScadenziario extends Dettaglio {

    private ArrayList listaScadenziarioFatt = new ArrayList();
    private ArrayList listaScadenziarioResi = new ArrayList();
    private ArrayList listaScadenziarioResiCliente = new ArrayList();
    private ArrayList listaScadenziarioAcq = new ArrayList();
    private ArrayList listaScadenziarioScon = new ArrayList();
    private java.util.Date dataDa;
    private java.util.Date dataA;

    private HtmlForm form = new HtmlForm();
    private BeanScadenziario beanScadenziario = new BeanScadenziario();

    public void setBeanScadenziario(BeanScadenziario beanScadenziario) {
        setObj(beanScadenziario);
        this.beanScadenziario = beanScadenziario;
    }

    public BeanScadenziario getBeanScadenziario() {
        return (BeanScadenziario) getObj();
    }

    public HtmlForm getForm() {
        form = (HtmlForm) Utilita.getSession().getAttribute("form");
        if (form == null) {
            form = new HtmlForm();
        }
        FacesContext ctx = FacesContext.getCurrentInstance();
        beanScadenziario = (BeanScadenziario) ctx.getExternalContext().getRequestMap().get("beanScadenziario");
        Utilita.getSession().removeAttribute("form");
        return form;
    }

    public void setForm(HtmlForm form) {
        setFormObject(form);
        this.form = form;
        Utilita.getSession().setAttribute("form", form);
    }

    public void entra(ActionEvent ae) {
        pulisci();

        BeanLogin login = (BeanLogin) Utilita.getSession().getAttribute("login");
        Date date = new Date(System.currentTimeMillis());
        Calendar calendario = new GregorianCalendar();
        calendario.setTime(date);
        int meseValuta = calendario.get(Calendar.MONTH);

        calendario = new GregorianCalendar(login.getAnnoGestione().intValue(), meseValuta, 1);
        this.dataDa = calendario.getTime();
        int ultimoGiornoMese = calendario.getActualMaximum(GregorianCalendar.DAY_OF_MONTH);
        calendario = new GregorianCalendar(login.getAnnoGestione().intValue(), meseValuta, ultimoGiornoMese);
        this.dataA = calendario.getTime();

        beanScadenziario.setDataDa(this.dataDa);
        beanScadenziario.setDataA(this.dataA);

        try {
            caricaScadenziarioFatt();
            caricaScadenziarioAcq();
            caricaScadenziarioScon();
            beanScadenziario.setDifferenzaIva(arrotonda(new Double(beanScadenziario.getImpostaAcquisto().doubleValue() - beanScadenziario.getImpostaVendita().doubleValue()), 2));
            beanScadenziario.setIvaVersare(beanScadenziario.getDifferenzaIva());
            beanScadenziario.setListaScadenziarioFatt(listaScadenziarioFatt);
            beanScadenziario.setListaScadenziarioResi(listaScadenziarioResi);
            beanScadenziario.setListaScadenziarioResiCliente(listaScadenziarioResiCliente);

            beanScadenziario.setListaScadenziarioAcq(listaScadenziarioAcq);
            beanScadenziario.setListaScadenziarioScon(listaScadenziarioScon);
            Utilita.getRequest().setAttribute("beanScadenziario", beanScadenziario);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Errore" + e);
        } finally {
            DAOConnectionSingleton.closeSession();
        }
        String url2 = "/dettaglioScadenziario.jsf";
        FacesContext ctx = FacesContext.getCurrentInstance();
        UIViewRoot view = ctx.getApplication().getViewHandler().createView(ctx, url2);
        view.setViewId(url2);
        ctx.setViewRoot(view);
        ctx.renderResponse();
    }

    public void calcolaNuovoPeriodo() {
        Utilita.getRequest().removeAttribute("form");
        beanScadenziario = (BeanScadenziario) Utilita.getRequest().getAttribute("beanScadenziario");

        dataDa = new java.sql.Date(beanScadenziario.getDataDa().getTime());
        dataA = new java.sql.Date(beanScadenziario.getDataA().getTime());

        beanScadenziario.setImponibileVendita(new Double(0));
        beanScadenziario.setImpostaVendita(new Double(0));
        beanScadenziario.setImponibileAcquisto(new Double(0));
        beanScadenziario.setImpostaAcquisto(new Double(0));
        beanScadenziario.setImponibileVendita(new Double(0));
        beanScadenziario.setImpostaVendita(new Double(0));

        try {
            caricaScadenziarioFatt();
            caricaScadenziarioAcq();
            caricaScadenziarioScon();
            beanScadenziario.setDifferenzaIva(arrotonda(new Double(beanScadenziario.getImpostaAcquisto().doubleValue() - beanScadenziario.getImpostaVendita().doubleValue()), 2));
            beanScadenziario.setIvaVersare(beanScadenziario.getDifferenzaIva());
            beanScadenziario.setListaScadenziarioFatt(listaScadenziarioFatt);
            beanScadenziario.setListaScadenziarioResi(listaScadenziarioResi);

            beanScadenziario.setListaScadenziarioResiCliente(listaScadenziarioResiCliente);
            beanScadenziario.setListaScadenziarioAcq(listaScadenziarioAcq);
            beanScadenziario.setListaScadenziarioScon(listaScadenziarioScon);

            Utilita.getRequest().setAttribute("beanScadenziario", beanScadenziario);

        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Errore" + e);
        } finally {
            DAOConnectionSingleton.closeSession();
        }
        String url2 = "/dettaglioScadenziario.jsf";
        FacesContext ctx = FacesContext.getCurrentInstance();
        UIViewRoot view = ctx.getApplication().getViewHandler().createView(ctx, url2);
        view.setViewId(url2);
        ctx.setViewRoot(view);
        ctx.renderResponse();
    }

    public void caricaScadenziarioFatt() throws DAOException {
        String query = "select beanFattura from BeanFattura beanFattura"
                + " where beanFattura.data between :dataDa and :dataA"
                + " order by beanFattura.data, beanFattura.beanCliente.ragioneSociale";

        Session session = DAOConnectionSingleton.newSession();
        listaScadenziarioFatt = (ArrayList) session.createQuery(query).setDate("dataDa", dataDa).setDate("dataA", dataA).list();

        for (int i = 0; i < listaScadenziarioFatt.size(); i++) {
            BeanFattura beanFattura = (BeanFattura) listaScadenziarioFatt.get(i);
            Double tot = new Double(beanFattura.getImponibile().doubleValue() + beanScadenziario.getImponibileVendita().doubleValue());
            beanScadenziario.setImponibileVendita(arrotonda(tot, 2));
            tot = new Double(beanFattura.getIva().doubleValue() + beanScadenziario.getImpostaVendita().doubleValue());
            beanScadenziario.setImpostaVendita(arrotonda(tot, 2));
        }

        //Resi fornitore
        query = "select beanResoFornitore from BeanResoFornitore beanResoFornitore"
                + " where beanResoFornitore.dataReso between :dataDa and :dataA"
                + " order by beanResoFornitore.dataReso, beanResoFornitore.beanFornitore.ragioneSociale";

        session = DAOConnectionSingleton.newSession();
        listaScadenziarioResi = (ArrayList) session.createQuery(query).setDate("dataDa", dataDa).setDate("dataA", dataA).list();

        for (int i = 0; i < listaScadenziarioResi.size(); i++) {
            BeanResoFornitore beanResoFornitore = (BeanResoFornitore) listaScadenziarioResi.get(i);
            Double tot = new Double((-1 * beanResoFornitore.getImponibile().doubleValue()) + beanScadenziario.getImponibileVendita().doubleValue());
            beanScadenziario.setImponibileVendita(arrotonda(tot, 2));
            tot = new Double((-1 * beanResoFornitore.getIva().doubleValue()) + beanScadenziario.getImpostaVendita().doubleValue());
            beanScadenziario.setImpostaVendita(arrotonda(tot, 2));
        }

        //Resi Cliente
        query = "select beanResoFornitore from BeanResoCliente beanResoFornitore"
                + " where beanResoFornitore.dataReso between :dataDa and :dataA"
                + " order by beanResoFornitore.dataReso, beanResoFornitore.beanCliente.ragioneSociale";

        session = DAOConnectionSingleton.newSession();
        listaScadenziarioResiCliente = (ArrayList) session.createQuery(query).setDate("dataDa", dataDa).setDate("dataA", dataA).list();

        for (int i = 0; i < listaScadenziarioResiCliente.size(); i++) {
            BeanResoCliente beanResoCliente = (BeanResoCliente) listaScadenziarioResiCliente.get(i);
            Double tot = new Double((-1 * beanResoCliente.getImponibile().doubleValue()) + beanScadenziario.getImponibileVendita().doubleValue());
            beanScadenziario.setImponibileVendita(arrotonda(tot, 2));
            tot = new Double((-1 * beanResoCliente.getIva().doubleValue()) + beanScadenziario.getImpostaVendita().doubleValue());
            beanScadenziario.setImpostaVendita(arrotonda(tot, 2));
        }

    }

    public void caricaScadenziarioAcq() throws DAOException {
        String query = "select beanFatturaAcquisto from BeanFatturaAcquisto beanFatturaAcquisto"
                + " where beanFatturaAcquisto.data between :dataDa and :dataA"
                + " order by beanFatturaAcquisto.data, beanFatturaAcquisto.beanFornitore.ragioneSociale";

        Session session = DAOConnectionSingleton.newSession();
        listaScadenziarioAcq = (ArrayList) session.createQuery(query).setDate("dataDa", dataDa).setDate("dataA", dataA).list();

        for (int i = 0; i < listaScadenziarioAcq.size(); i++) {
            BeanFatturaAcquisto beanFatturaAcquisto = (BeanFatturaAcquisto) listaScadenziarioAcq.get(i);
            Double tot = new Double(beanFatturaAcquisto.getImponibile().doubleValue() + beanScadenziario.getImponibileAcquisto().doubleValue());
            beanScadenziario.setImponibileAcquisto(arrotonda(tot, 2));
            tot = new Double(beanFatturaAcquisto.getImposta().doubleValue() + beanScadenziario.getImpostaAcquisto().doubleValue());
            beanScadenziario.setImpostaAcquisto(arrotonda(tot, 2));
        }
    }

    public void caricaScadenziarioScon() throws DAOException {
        String query = "select scontrino from BeanScontrino scontrino"
                + " where scontrino.data  between :dataDa and :dataA"
                + " order by scontrino.data";

        Session session = DAOConnectionSingleton.newSession();
        listaScadenziarioScon = (ArrayList) session.createQuery(query).setDate("dataDa", dataDa).setDate("dataA", dataA).list();

        for (int i = 0; i < listaScadenziarioScon.size(); i++) {
            BeanScontrino beanScontrino = (BeanScontrino) listaScadenziarioScon.get(i);
            Double tot = new Double(beanScontrino.getImponibile().doubleValue() + beanScadenziario.getImponibileVendita().doubleValue());
            beanScadenziario.setImponibileVendita(arrotonda(tot, 2));
            tot = new Double(beanScontrino.getIva().doubleValue() + beanScadenziario.getImpostaVendita().doubleValue());
            beanScadenziario.setImpostaVendita(arrotonda(tot, 2));
        }
    }

    public Double arrotonda(Object obj, int precisione) {
        Double valore = (Double) obj;
        Double valoreArr = new Double(0);
        double pot = Math.pow(10, precisione);
        double v = valore.doubleValue() * pot;
        valoreArr = new Double(Math.round(v) / pot);
        return valoreArr;
    }

    public String calcolaMese(int mese) {
        String meseSt = "";
        switch (mese) {
            case 1:
                meseSt = "GENNAIO";
                break;
            case 2:
                meseSt = "FEBBRAIO";
                break;
            case 3:
                meseSt = "MARZO";
                break;
            case 4:
                meseSt = "APRILE";
                break;
            case 5:
                meseSt = "MAGGIO";
                break;
            case 6:
                meseSt = "GIUGNO";
                break;
            case 7:
                meseSt = "LUGLIO";
                break;
            case 8:
                meseSt = "AGOSTO";
                break;
            case 9:
                meseSt = "SETTEMBRE";
                break;
            case 10:
                meseSt = "OTTOBRE";
                break;
            case 11:
                meseSt = "NOVEMBRE";
                break;
            case 12:
                meseSt = "DICEMBRE";
                break;
            default:
                meseSt = "";
                break;
        }
        return meseSt;
    }

    public void pulisci() {
        HttpSession sessione = (HttpSession) Utilita.getSession();
        HttpServletRequest richiesta = (HttpServletRequest) Utilita.getRequest();

        sessione.removeAttribute("form");
        sessione.removeAttribute("posizioneOggetto");
        sessione.removeAttribute("beanFind");
    }
}
